<!DOCTYPE html>
<!-- saved from url=(0030)https://ru.manpages.org/dup3/2 -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <link rel="dns-prefetch" href="https://fonts.gstatic.com/">
  <link rel="dns-prefetch" href="https://fonts.googleapis.com/">
  <link rel="dns-prefetch" href="https://www.google-analytics.com/">
  <title>man dup3 (2): создать дубликат файлового дескриптора</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="description" content="man dup3 (2): Системный вызов dup() создаёт копию файлового дескриптора oldfd, используя для нового дескриптора самый маленький свободный номер файлового дескриптора. После успешного выполнения старый и новый файловые дескрипторы являются взаимозаменяемыми. Они указыва">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <link href="./man dup3 (2)_ создать дубликат файлового дескриптора_files/css" rel="stylesheet" type="text/css">
  <link href="./man dup3 (2)_ создать дубликат файлового дескриптора_files/css(1)" rel="stylesheet" type="text/css">
  <link href="./man dup3 (2)_ создать дубликат файлового дескриптора_files/css(2)" rel="stylesheet" type="text/css">
  <link data-turbolinks-track="true" href="./man dup3 (2)_ создать дубликат файлового дескриптора_files/application-f7897fbdd67c6822d0a0ff57b3ffc02f.css" media="all" rel="stylesheet">
  <script async="" src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/analytics.js"></script><script async="async" data-turbolinks-track="true" src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/application-b47bf462822a1e5557c375def5c1aa58.js"></script>

  <!--[if IE]>
        
    <![endif]-->
<script type="text/javascript">
//<![CDATA[
      var LANG = 'ru';
//]]>
</script>
  
  <meta content="authenticity_token" name="csrf-param">
<meta content="4W6o6SwK32wDjKVEI/JZsVMDDAysUHt5oSiVwv4rFfc=" name="csrf-token">
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-56225390-2', 'auto');
  ga('send', 'pageview');

</script>
</head>
<body>
  <div class="header-container">
    <header class="clearfix">
      <div class="logo"><a href="https://ru.manpages.org/"><img src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/logo-01e8ca9d4868e2e64bed82dde5c62d60.png" alt="logo"></a></div>
       <!--
        <nav>
    <ul>
        <li class="ОБЗОР selected"><a title="" href="#">ОБЗОР</a></li>
        <li class="ОПИСАНИЕ"><a title="" href="#">ОПИСАНИЕ</a></li>
        <li class="ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ"><a title="" href="#">ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ</a></li>
        <li class="ОШИБКИ"><a title="" href="#">ОШИБКИ</a></li>
    </ul>
  </nav>
  -->
      <div class="search">
        <form accept-charset="UTF-8" action="https://ru.manpages.org/pagenames/autocomplete_page_name_name" method="post"><div style="display:none"><input name="utf8" type="hidden" value="✓" class="ui-autocomplete-input" autocomplete="off"><input name="authenticity_token" type="hidden" value="4W6o6SwK32wDjKVEI/JZsVMDDAysUHt5oSiVwv4rFfc=" class="ui-autocomplete-input" autocomplete="off"></div>
            <input data-autocomplete="/pagenames/autocomplete_page_name_name" id="page_name_name" name="page_name[name]" placeholder="Поиск в MAN файлах..." type="text" class="ui-autocomplete-input" autocomplete="off">
            <button type="submit" onclick="return false">
              <img src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/search_-5f10690007ebc2fbfce6cf9b1f687474.svg">
            </button>
</form>      </div>
      <a class="mcat"><img src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/menu-533ee2b7609b0e242c51d7f42ca18b7f.png"></a>
    </header>
  </div>
  <div id="core">
    <div class="main-wrapper">
      <link rel="stylesheet" href="./man dup3 (2)_ создать дубликат файлового дескриптора_files/default.min.css">
<script src="./man dup3 (2)_ создать дубликат файлового дескриптора_files/highlight.min.js"></script>

<div class="manpages-show">


<div class="main-container">
  <main>

    <div class="article-container">
        <div class="article_table">
            <span>dup3<i>(2)</i></span>
            <span>создать дубликат файлового дескриптора</span>
        </div>
      <article>
        <div class="alias">
          <p><span class="translation_missing" title="translation missing: ru.Other_Alias">Other Alias</span></p>
          <span>dup, dup2</span>
        </div>
        <a name=""></a><div class="section">
<h2>ОБЗОР</h2>

<p></p><p><b>#include &lt;unistd.h&gt;</b><br></p><hr><b>int dup(int </b><i>oldfd</i><b>);</b><br><b>int dup2(int </b><i>oldfd</i><b>, int </b><i>newfd</i><b>);</b><br><hr><b>#define _GNU_SOURCE</b>             /* Смотрите <a class="man" category="7" href="https://ru.manpages.org/feature_test_macros/7">feature_test_macros</a>(7) */<br><b>#include &lt;fcntl.h&gt;</b>              /* Определение констант O_* */<br><b>#include &lt;unistd.h&gt;</b><br><hr><b>int dup3(int </b><i>oldfd</i><b>, int </b><i>newfd</i><b>, int </b><i>flags</i><b>);</b><p></p>


</div>
<a name=""></a><div class="section">
<h2>ОПИСАНИЕ</h2>
Системный вызов <b>dup</b>() создаёт копию файлового дескриптора <i>oldfd</i>,
используя для нового дескриптора самый маленький свободный номер файлового
дескриптора.
<p>
После успешного выполнения старый и новый файловые дескрипторы являются
взаимозаменяемыми. Они указывают на одно и то же открытое файловое описание
(смотрите <b><a class="man" category="2" href="https://ru.manpages.org/open/2">open</a></b>(2)) и поэтому имеют общее файловое смещение и флаги
состояния файла; например, если файловое смещение изменить с помощью
<b><a class="man" category="2" href="https://ru.manpages.org/lseek/2">lseek</a></b>(2) через один из файловых дескрипторов, то смещение изменится и для
другого.
</p><p>
Эти два файловых дескриптора имеют различные флаги дескриптора файла (флаг
close-on-exec). Флаг close-on-exec (<b>FD_CLOEXEC</b>; см. <b><a class="man" category="2" href="https://ru.manpages.org/fcntl/2">fcntl</a></b>(2)) у копии
дескриптора сбрасывается.
</p></div>
<div class="section">
<h2>dup2()</h2>
Системный вызов <b>dup2</b>() выполняет ту же задачу, что и <b>dup</b>(), но вместо
использования самого маленького неиспользуемого номера файлового
дескриптора, он использует номер файлового дескриптора, указанного в
<i>newfd</i>. Если файловый дескриптор <i>newfd</i> уже открыт, то он закрывается
перед повторным использованием.
<p>
Шаги по закрытию и повторному использованию файлового дескриптора <i>newfd</i>
выполняются <i>атомарно</i>. Это важно, так как попытка реализовать подобное с
помощью <b><a class="man" category="2" href="https://ru.manpages.org/close/2">close</a></b>(2) и <b>dup</b>() привело бы к состязательности, в силу чего
<i>newfd</i> мог быть задействован повторно между этими двумя шагами. Такое
повторное использование может произойти, из-за прерывания основной программы
обработчиком сигналов, который выделяет файловый дескриптор, или из-за
параллельной нити, выделяющей файловый дескриптор.
</p><p>
Также заметим следующее:
</p><dl compact="compact">
<dt>*</dt><dd>
Если <i>oldfd</i> является некорректным файловым дескриптором, то вызов
завершается с ошибкой, а <i>newfd</i> не закрывается.
</dd><dt>*</dt><dd>
Если <i>oldfd</i> является корректным файловым дескриптором, а номер <i>newfd</i>
совпадает с <i>oldfd</i>, то <b>dup2</b>() не делает ничего и возвращает значение
<i>newfd</i>.
</dd></dl>

</div>
<div class="section">
<h2>dup3()</h2>

<b>dup3</b>() похож на <b>dup2</b>(). Отличия заключаются в следующем:
<dl compact="compact">
<dt>*</dt><dd>
Вызывающий может принудительно установить флаг close-on-exec flag у нового
файлового дескриптора, указав <b>O_CLOEXEC</b> в <i>flags</i>. Зачем это может быть
нужно смотрите в <b><a class="man" category="2" href="https://ru.manpages.org/open/2">open</a></b>(2).
</dd><dt>*</dt><dd>
Если <i>oldfd</i> равно <i>newfd</i>, то <b>dup3</b>() выдает ошибку <b>EINVAL</b>.
</dd></dl>

</div>
<a name=""></a><div class="section">
<h2>ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ</h2>
В случае успеха данные системные вызовы возвращают новый файловый дескриптор
или -1, если произошла ошибка (в этом случае <i>errno</i> устанавливается
должным образом).
</div>
<a name=""></a><div class="section errors">
<h2>ОШИБКИ</h2>

<dl compact="compact">
<dt><b>EBADF</b></dt><dd>
Значение <i>oldfd</i> не является открытым файловым дескриптором.
</dd><dt><b>EBADF</b></dt><dd>
Значение <i>newfd</i> находится вне допустимого диапазона файловых дескрипторов
(смотрите описание <b>RLIMIT_NOFILE</b> в <b><a class="man" category="2" href="https://ru.manpages.org/getrlimit/2">getrlimit</a></b>(2)).
</dd><dt><b>EBUSY</b></dt><dd>
(только в Linux) Может случиться в <b>dup2</b>() или <b>dup3</b>() при возникновении
состязательности вызовов <b><a class="man" category="2" href="https://ru.manpages.org/open/2">open</a></b>(2) и <b>dup</b>().
</dd><dt><b>EINTR</b></dt><dd>
Вызов <b>dup2</b>() или <b>dup3</b>() был прерван каким-либо сигналом. Смотрите
<b><a class="man" category="7" href="https://ru.manpages.org/signal/7">signal</a></b>(7).
</dd><dt><b>EINVAL</b></dt><dd>
(<b>dup3</b>()) <i>flags</i> содержит некорректное значение.
</dd><dt><b>EINVAL</b></dt><dd>
(<b>dup3</b>()) <i>oldfd</i> было равно <i>newfd</i>.
</dd><dt><b>EMFILE</b></dt><dd>
Было достигнуто ограничение по количеству открытых файловых дескрипторов на
процесс (смотрите описание <b>RLIMIT_NOFILE</b> в <b><a class="man" category="2" href="https://ru.manpages.org/getrlimit/2">getrlimit</a></b>(2)).
</dd></dl>

</div>
<div class="section">
<h2>ВЕРСИИ</h2>
Вызов <b>dup3</b>() был добавлен в Linux версии 2.6.27; поддержка в glibc
доступна с версии 2.9.
</div>
<div class="section">
<h2>СООТВЕТСТВИЕ СТАНДАРТАМ</h2>

<b>dup</b>(), <b>dup2</b>(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
<p>



<b>dup3</b>() есть только в Linux.
</p></div>
<div class="section">
<h2>ЗАМЕЧАНИЯ</h2>
Ошибка, которую возвращает <b>dup2</b>(), отличается от той, что возвращает
<b>fcntl(</b>…, <b>F_DUPFD</b>, …<b>)</b>, когда <i>newfd</i> находится вне допустимых
пределов. На некоторых системах <b>dup2</b>() также иногда возвращает <b>EINVAL</b>
— как <b>F_DUPFD</b>.
<p>
Если был открыт <i>newfd</i>, то любые ошибки, о которых было бы сообщено
<b><a class="man" category="2" href="https://ru.manpages.org/close/2">close</a></b>(2), теряются. Если это важно, то (если программа однонитевая и не
выделяет файловые дескрипторы в обработчиках сигналов) правильней будет
<i>не</i> закрывать <i>newfd</i> перед вызовом <b>dup2</b>(), из-за состязательности,
описанной выше. Вместо этого можно использовать, например, такой код:
</p><p>
</p><pre class="hljs cpp">    <span class="hljs-comment">/* Получить копию «newfd», которую затем можно
       использовать для проверки ошибок close(); ошибка EBADF
       означает, что «newfd» не открыт. */</span>
    tmpfd = dup(newfd);
    <span class="hljs-keyword">if</span> (tmpfd == -<span class="hljs-number">1</span> &amp;&amp; errno != EBADF) {
        <span class="hljs-comment">/* обработка неожидаемой ошибки dup() */</span>
    }
    <span class="hljs-comment">/* атомарное копирование «oldfd» в «newfd» */</span>
    <span class="hljs-keyword">if</span> (dup2(oldfd, newfd) == -<span class="hljs-number">1</span>) {
        <span class="hljs-comment">/* обработка ошибки dup2() */</span>
    }
    <span class="hljs-comment">/* теперь проверим ошибки close() у файла, на который изначально
       ссылался «newfd» */</span>
    <span class="hljs-keyword">if</span> (tmpfd != -<span class="hljs-number">1</span>) {
        <span class="hljs-keyword">if</span> (close(tmpfd) == -<span class="hljs-number">1</span>) {
            <span class="hljs-comment">/* обработка ошибок закрытия */</span>
        }
    }
</pre>


</div>

      </article>
    </div>


  </main>
</div>
<div class="nav-container">
<div class="nav" style="height:526px">
<div class="inner">
  <nav class="box">
    <h4>содержание</h4>
    <ul>
        <li class="ОБЗОР selected"><a title="" href="https://ru.manpages.org/dup3/2#">ОБЗОР</a></li>
        <li class="ОПИСАНИЕ"><a title="" href="https://ru.manpages.org/dup3/2#">ОПИСАНИЕ</a></li>
        <li class="ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ"><a title="" href="https://ru.manpages.org/dup3/2#">ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ</a></li>
        <li class="ОШИБКИ"><a title="" href="https://ru.manpages.org/dup3/2#">ОШИБКИ</a></li>
    </ul>
  </nav>

  <div class="box lang">
    <h4>ПЕРЕВОДЫ</h4>
    <ul>
        <li class="en"><a class="c2" href="https://manpages.org/dup3/2"><i></i>АНГЛИЙСКИЙ</a></li>
        <li class="fr"><a class="c2" href="https://fr.manpages.org/dup3/2"><i></i>ФРАНЦУЗСКИЙ</a></li>
        <li class="ja"><a class="c2" href="https://ja.manpages.org/dup3/2"><i></i>ЯПОНСКИЙ</a></li>
    </ul>
  </div>
  

<!--
    <div class="ads">
      <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
      <ins class="adsbygoogle"
           style="display:inline-block;width:300px;height:250px"
           data-ad-client="ca-pub-2811344342425918"
           data-ad-slot="5277441578"></ins>
      <script>
          (adsbygoogle = window.adsbygoogle || []).push({});
      </script>
    </div>
-->
    <div class="box see-also">
      <h4>СМОТРИТЕ ТАКЖЕ</h4>
      <ul class="clearfix">
            <li><a href="https://ru.manpages.org/close/2" class="c2">close <span>(2)</span></a></li>
            <li><a href="https://ru.manpages.org/fcntl/2" class="c2">fcntl <span>(2)</span></a></li>
            <li><a href="https://ru.manpages.org/open/2" class="c2">open <span>(2)</span></a></li>
      </ul>
    </div>

        <div class="box last-searched">
          <h4>ПОСЛЕДНИЕ ЗАПРОСЫ</h4>
          <ul class="clearfix">
                <li><a href="https://manpages.org/sgbsvx/3" class="c3">SGBSVX <span>(3)</span></a></li>
                <li><a href="https://manpages.org/dspam_merge" class="c1">dspam_merge <span>(1)</span></a></li>
                <li><a href="https://manpages.org/run" class="c1">run <span>(1)</span></a></li>
                <li><a href="https://manpages.org/bn_new/3" class="c3">BN_new <span>(3)</span></a></li>
                <li><a href="https://es.manpages.org/po4a-updatepo" class="c1">po4a-updatepo <span>(1)</span></a></li>
                <li><a href="https://manpages.org/psposvx" class="c1">PSPOSVX <span>(1)</span></a></li>
                <li><a href="https://pl.manpages.org/rpmdeps/8" class="c8">rpmdeps <span>(8)</span></a></li>
                <li><a href="https://manpages.org/metabaseusersecret/3" class="c3">Metabase::User::Secret <span>(3)</span></a></li>
                <li><a href="https://manpages.org/nge/4" class="c4">nge <span>(4)</span></a></li>
                <li><a href="https://ja.manpages.org/crontab" class="c1">crontab <span>(1)</span></a></li>
                <li><a href="https://manpages.org/libcaca-thanks/3" class="c3">libcaca-thanks <span>(3)</span></a></li>
          </ul>
        </div>
</div>
  </div>
  </div>

</div>
<script>
$(document).ready(function() {
    $('pre, code').each(function(i, block) {
    hljs.highlightBlock(block);
    });
});
</script>

    </div>
  </div><ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content" id="ui-id-1" tabindex="0" style="display: none;"></ul><span role="status" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"></span>
  <div class="overlay"></div>
  <div class="overlay_"></div>


<ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content" id="ui-id-2" tabindex="0" style="display: none;"></ul><span role="status" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"></span><ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content" id="ui-id-3" tabindex="0" style="display: none;"></ul><span role="status" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"></span><div class="overlay"></div></body><style id="stylus-1" type="text/css" class="stylus">body {
    font-family: 'pragmata pro mono regular';
}</style></html>